home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 003 / dbapg.arc / CROSSREF.PRG < prev    next >
Encoding:
Text File  |  1984-08-26  |  8.4 KB  |  305 lines

  1. * Program.: CROSSREF.PRG
  2. * Author..: Roy M. Moore, modified by Luis A. Castro
  3. * Date....: 11/1/83, 08/26/84
  4. * Notice..: Copyright 1983, Roy M. Moore, All Rights Reserved.
  5. * Version.: dBASE II, version 2.4x
  6. * Notes...: Creates a reference table of variables for up to
  7. *           30 command files.  
  8. *
  9. CLEAR
  10. SET TALK OFF
  11. SET RAW ON
  12. STORE "PRG" TO extension
  13. *
  14. ERASE
  15. @ 2, 0 SAY "GENERATE CROSS-REFERENCE TABLE"
  16. @ 2,72 SAY DATE()
  17. @ 3, 0 SAY "========================================"
  18. @ 3,40 SAY "========================================" 
  19. ACCEPT "Enter output filename " TO outfile
  20. ? "Enter command filename(s) [separated by commas] "
  21. ACCEPT TO mfiles
  22. STORE "N" TO listit
  23. @ 9, 0 SAY "Print command files? [Y/N] ";
  24.        GET listit PICTURE "!"
  25. READ 
  26. *
  27. * ---Separate list of files.
  28. STORE '11' TO item
  29. DO WHILE ',' $ mfiles
  30.    STORE $( mfiles, 1, @(',',mfiles) - 1 ) TO filename&item
  31.    STORE $( mfiles, @(',',mfiles) + 1 ) TO mfiles
  32.    STORE STR( VAL( item ) + 1, 2 ) TO item
  33. ENDDO
  34. STORE mfiles TO filename&item
  35. STORE item TO item:max
  36. *
  37. * ---Check to see if command file(s) exist.
  38. DO WHILE item >= "11"
  39.    STORE !( TRIM( filename&item ) ) + "." TO filename&item
  40.    STORE $( filename&item, 1,;
  41.          @(".",filename&item) - 1 ) TO filename&item
  42.    IF .NOT. FILE( filename&item + "." + extension )
  43.       ? "&filename&item" + " DOES NOT EXIST"
  44.       CLEAR
  45.       RETURN
  46.    ENDIF
  47.    STORE STR( VAL( item ) - 1, 2 ) TO item
  48. ENDDO
  49. *
  50. * ---The following is a list of the dBASE II "reserved" words. 
  51. * ---Feel free to add or delete what you wish.
  52. *
  53. STORE ",*,AND,USE,WAIT,TO,SET,SKIP,NOT,OR,?," +;
  54.    "ACCEPT,ALL,APPEND,READ,ON,SAY,BELL,BLANK,WHILE," +;
  55.    "BOTTOM,WITH,CASE,CHR,CLEAR," TO tokens1
  56. STORE tokens1 +;
  57.    "COMMAND,CONFIRM,CONSOLE,CONTINUE,COPY,COUNT,CREATE," +;
  58.    "DATE,DELETE,DELIMITED,DISPLAY,DO,EDIT,EJECT,ELSE," +;
  59.    "ENDCASE,ENDDO," TO tokens1
  60. *
  61. STORE ",ENDIF,ENDTEXT,EOF,ERASE,ESCAPE,EXCEPT,EXTENDED," +;
  62.    "FIELD,FILE,FILES,FIND,FOR,ADD,,FORM,FORMAT,FROM,GET," +;
  63.    "GETS,GO,GOTO,HEADING,IF,INDEX," TO tokens2
  64. STORE tokens2 +;
  65.    "INPUT,INSERT,INT,INTENSITY,JOIN,LEN,LIKE,LINKAGE," +;
  66.    "LIST,LOAD,LOCATE,LOOP,MARGIN,MEMORY,MODIFY,NOTE,OFF," +;
  67.    "OTHERWISE," TO tokens2
  68. *
  69. STORE ",PACK,PEEK,PICTURE,POKE,PRIMARY,PRINT,QUIT,RAW," +;
  70.    "BEFORE,RECALL,RECORD,RELEASE,REMARK,RENAME,REPLACE," +;
  71.    "REPORT,RESET,RESTORE,RETURN," TO tokens3
  72. STORE tokens3 +;
  73.    "SAVE,SCREEN,SDF,SECONDARY,SELECT,SORT,STATUS,"+;
  74.    "STORE,STR,STRUCTURE,SUM,TALK,TEST,TEXT,TOP,TOTAL," +;
  75.    "TRIM,TYPE," TO tokens3
  76. *
  77. STORE ",ALTERNATE,UPDATE,VAL,CALL,DESCENDING,ADDITIVE,"+;
  78.       "ASCENDING,EXACT,CANCEL,CHANGE,COLON," TO tokens4
  79. *
  80. * ---Setup the CROSSREF files.
  81. SELECT PRIMARY
  82. USE Crossget
  83. COPY STRUCTURE TO Crossget.$$$
  84. USE Crossget.$$$
  85. *
  86. SELECT SECONDARY
  87. USE Crossput
  88. COPY STRUCTURE TO Crossput.$$$
  89. USE Crossput.$$$
  90. INDEX ON PUT:token + PUT:file TO Crossput
  91. *
  92. SELECT PRIMARY
  93. SET ALTERNATE TO &outfile
  94. *
  95. * ---Now, let's start generating the cross-reference table.
  96. @ 10,0 SAY " "
  97. STORE item:max TO item
  98. *
  99. DO WHILE item >= "11"
  100. *
  101. STORE filename&item + "." + extension TO mfile
  102. ?
  103. ? "Appending command file " + mfile + "... "
  104. APPEND FROM &mfile SDF
  105. GO TOP
  106. IF listit = "Y"
  107.    ? "Printing command file to " + outfile + "..."
  108.    SET ALTERNATE ON
  109.    SET CONSOLE OFF
  110.    ?
  111.    ? "Filename: " + filename&item
  112.    ?
  113.    LIST
  114.    ?
  115.    ? ".PA"
  116.    SET CONSOLE ON
  117.    SET ALTERNATE OFF
  118.    GO TOP
  119. ENDIF
  120. * ---Process the command lines.
  121. ?
  122. ? "Getting the variable names... "
  123. ?
  124. DO WHILE .NOT. EOF
  125.    *
  126.    STORE TRIM( GET:line ) TO workline
  127.    IF workline = " " .AND. LEN( workline ) = 1
  128.       * ---It must be a blank line.
  129.       SKIP
  130.       LOOP
  131.    ENDIF
  132.    *
  133.    * ---Strip leading control characters and blanks.
  134.    STORE 1 TO ptr
  135.    STORE LEN( workline ) TO line:len
  136.    DO WHILE RANK( $(workline,ptr,1) ) < 33 .AND. ptr < line:len
  137.       STORE ptr + 1 TO ptr
  138.    ENDDO
  139.    STORE $( workline, ptr ) TO workline
  140.    *
  141.    * ---Ignore comment lines.
  142.    IF workline = "*"
  143.       SKIP
  144.       LOOP
  145.    ENDIF
  146.    *
  147.    STORE !( workline ) + " " TO workline
  148.    STORE STR( #, 5 ) TO linenumber
  149.    *
  150.    * ---NOTE: This section of dBASE II code can be
  151.    * ---rewritten in assembly code for faster execution.
  152.    *
  153.    * ---Parse a single command line, until end-of-string.
  154.    STORE 1 TO ptr, lastptr
  155.    STORE LEN( workline ) TO line:len
  156.    *
  157.    DO WHILE lastptr <= line:len
  158.    *
  159.    * ---Skip everything but string delimiters ( " ' [ )
  160.    * ---and alpha characters.
  161.    STORE lastptr TO ptr
  162.    STORE RANK( $( workline, ptr, 1 ) ) TO num
  163.    DO WHILE num <> 34 .AND. num <> 39 .AND. num <> 91 .AND.;
  164.             ( num < 65 .OR. num > 90 ) .AND. ptr <= line:len
  165.       STORE ptr + 1 TO ptr
  166.       IF ptr <= line:len
  167.          STORE RANK( $( workline, ptr, 1 ) ) TO num
  168.       ENDIF
  169.    ENDDO
  170.    STORE ptr TO startptr, lastptr
  171.    IF ptr > line:len   
  172.       LOOP
  173.    ENDIF
  174.    * ---Locate a token in the line.
  175.    DO CASE
  176.       CASE num > 64 .AND. num < 91
  177.       * ---Alpha characters.
  178.          DO WHILE ptr <= line:len .AND.;
  179.             ((num>64 .AND. num<91) .OR. (num>47 .AND. num<59))
  180.             STORE ptr + 1 TO ptr
  181.             IF ptr <= line:len
  182.                STORE RANK( $( workline, ptr, 1 ) ) TO num
  183.             ENDIF
  184.          ENDDO
  185.       CASE num = 34 .OR. num = 39 .OR. num = 91
  186.       * ---Literal string.  
  187.          IF num = 91
  188.             STORE 93 TO num
  189.          ENDIF
  190.          STORE @( CHR(num), $( workline, ptr + 1 ) ) TO pos
  191.          IF pos = 0
  192.             * ---Could not find matching string delimiter.
  193.             STORE line:len + 1 TO ptr, lastptr
  194.             LOOP
  195.          ENDIF
  196.          STORE ptr + pos + 1 TO ptr, lastptr
  197.          LOOP
  198.    ENDCASE
  199.    STORE ptr TO lastptr
  200.    *
  201.    * ---END-OF-NOTE: Rewrite in assembly code up to this point.
  202.    *
  203.    STORE $( workline, startptr, lastptr - startptr ) TO token
  204.    STORE "," + token + "," TO token1
  205.    *
  206.    * ---If reserved word then get next token. 
  207.    * ---DO CASE is used instead of IF...ENDIF to reduce 
  208.    * ---the amount of code executed if a match is found.
  209.    DO CASE
  210.       CASE token1 $ tokens1
  211.            LOOP
  212.       CASE token1 $ tokens2
  213.            LOOP
  214.       CASE token1 $ tokens3
  215.            LOOP
  216.       CASE token1 $ tokens4
  217.            LOOP
  218.    ENDCASE
  219.    ?? token + ","
  220.    *
  221.    * ---Check to see if token is already in the CROSSPUT table: 
  222.    STORE $( token + "          ", 1, 10 ) +;
  223.          $( filename&item + "        ", 1, 8 ) TO key:value
  224.    SELECT SECONDARY
  225.    FIND "&key:value"
  226.    *
  227.    IF # = 0
  228.       * ---Token is not in the reference table.
  229.       * ---Create a record for the new token.
  230.       APPEND BLANK
  231.       REPLACE PUT:token WITH token,;
  232.               PUT:file  WITH filename&item,;
  233.               PUT:line  WITH linenumber
  234.    ELSE
  235.       * ---Token is already in the reference table.
  236.       * ---Just add the command line number.
  237.          REPLACE PUT:line WITH TRIM( PUT:line ) + linenumber
  238.    ENDIF
  239.    *
  240.    ENDDO
  241.    SELECT PRIMARY
  242.    SKIP
  243. ENDDO
  244. *
  245. * ---Initialize for the next command file.
  246. STORE STR( VAL( item ) - 1, 2 ) TO item
  247. USE Crossget
  248. COPY STRUCTURE TO Crossget.$$$
  249. USE Crossget.$$$
  250. *
  251. ENDDO
  252. *
  253. * ---Print cross-reference table from CROSSPUT.$$$ 
  254. ?
  255. ? "Printing cross-reference table... "
  256. SET CONSOLE OFF
  257. SET ALTERNATE ON
  258. ?
  259. ? "VARIABLE    FILENAME  OCCURRENCES"
  260. ? "==========  ========  ====================="
  261. *
  262. SELECT SECONDARY
  263. GO TOP
  264. * ---The constant "work:width" should be a multiple of five.
  265. STORE 50 TO work:width
  266. STORE " " TO last:token
  267. DO WHILE .NOT. EOF
  268.    IF PUT:token <> last:token
  269.       ? PUT:token + "  "
  270.       ?? PUT:file + "  "
  271.    ELSE
  272.       ? $( STR( 0, 13 ), 1, 12 ) + PUT:file + "  "
  273.    ENDIF
  274.    ?? $( PUT:line, 1, work:width )
  275.    *
  276.    * ---Print the occurrence lines that follow.
  277.    STORE work:width + 1 TO work:count
  278.    DO WHILE work:count < 250
  279.       IF LEN( TRIM ( $( PUT:line, work:count ) ) ) > 1
  280.          ? $( STR( 0, 23 ), 1, 22 ) +;
  281.            $( PUT:line, work:count, work:width )
  282.       ENDIF
  283.       STORE work:count + work:width TO work:count
  284.    ENDDO
  285.    *
  286.    STORE PUT:token TO last:token
  287.    SKIP
  288. ENDDO
  289. ?
  290. SET ALTERNATE OFF
  291. SET ALTERNATE TO
  292. SET CONSOLE ON
  293. CLEAR
  294. DELETE FILE Crossget.$$$
  295. DELETE FILE Crossput.$$$
  296. DELETE FILE Crossput.ndx
  297. ?
  298. ? "Finished..."
  299. *
  300. SET RAW OFF
  301. SET TALK ON
  302. RETURN
  303. * EOF: CROSSREF.PRG
  304.